package com.linjm.cart.service.impl;

import com.alibaba.fastjson.JSON;
import com.linjm.bean.CartInfo;
import com.linjm.bean.SkuInfo;
import com.linjm.cart.mapper.CartInfoMapper;
import com.linjm.cart.service.CartConst;
import com.linjm.service.CartService;
import com.linjm.service.ManageService;
import com.linjm.service.SpuService;
import com.linjm.util.RedisUtil;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@DubboService
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private CartInfoMapper cartInfoMapper;
    @Autowired
    private RedisUtil redisUtil;
    @DubboReference
    private SpuService spuService;

    @Override
    public void addToCart(String skuId, String userId, Integer skuNum) {
        //先查看购物车是否有商品 skuId
        CartInfo cartInfo = new CartInfo();
        cartInfo.setSkuId(skuId);
        cartInfo.setUserId(userId);
        CartInfo cartInfoExist = cartInfoMapper.selectOne(cartInfo);
        if (cartInfoExist != null) {
            //更新sql中商品数量
            cartInfoExist.setSkuNum(cartInfoExist.getSkuNum() + skuNum);
            //更新实时价格
            cartInfoExist.setSkuPrice(cartInfoExist.getCartPrice());
            cartInfoMapper.updateByPrimaryKeySelective(cartInfoExist);
        } else {
            //如果不存在，保存购物车
            SkuInfo skuInfo = spuService.getSkuInfo(skuId);
            CartInfo cartInfo1 = new CartInfo();
            cartInfo1.setSkuId(skuId);
            cartInfo1.setCartPrice(skuInfo.getPrice());
            cartInfo1.setSkuPrice(skuInfo.getPrice());
            cartInfo1.setSkuName(skuInfo.getSkuName());
            cartInfo1.setImgUrl(skuInfo.getSkuDefaultImg());
            cartInfo1.setUserId(userId);
            cartInfo1.setSkuNum(skuNum);
            //插入到数据库
            cartInfoMapper.insertSelective(cartInfo1);
            cartInfoExist = cartInfo1;
        }
        // 构建key user:userid:cart
        String userCartKey = CartConst.USER_KEY_PREFIX+userId+CartConst.USER_CART_KEY_SUFFIX;
        // 准备取数据
        Jedis jedis = redisUtil.getJedis();
        // 将对象序列化
        String cartJson = JSON.toJSONString(cartInfoExist);
        jedis.hset(userCartKey,skuId,cartJson);
        // 更新购物车过期时间
        String userInfoKey = CartConst.USER_KEY_PREFIX+userId+CartConst.USERINFOKEY_SUFFIX;
        Long ttl = jedis.ttl(userInfoKey);
        jedis.expire(userCartKey,ttl.intValue());
        jedis.close();


    }

    @Override
    public List<CartInfo> getCartList(String userId) {
        List<CartInfo> cartInfoList = new ArrayList<>();
        //从redis中取得
        Jedis jedis = redisUtil.getJedis();
        // 构建key user:userid:cart
        String userCartKey = CartConst.USER_KEY_PREFIX+userId+CartConst.USER_CART_KEY_SUFFIX;
        List<String> cartJsons = jedis.hvals(userCartKey);

        if (cartJsons!=null&&cartJsons.size()>0){
            //遍历循环取出每个值并转换成对象添加到列表中
            for (String cartJson : cartJsons) {
                cartInfoList .add(JSON.parseObject(cartJson, CartInfo.class));
            }

        }else {
            //从数据库中取数据
            cartInfoList = loadCartCache(userId);
        }
        return cartInfoList;
    }

    //根据userId从数据库查询购物车
    private List<CartInfo> loadCartCache(String userId) {
        List<CartInfo> cartInfoList = cartInfoMapper.selectCartListWithCurPrice(userId);
        System.out.println(cartInfoList);
        Jedis jedis = redisUtil.getJedis();
        String userCartKey = CartConst.USER_KEY_PREFIX+userId+CartConst.USER_CART_KEY_SUFFIX;
        HashMap<String, String> map = new HashMap<>();
        for (CartInfo cartInfo : cartInfoList) {
            map.put(cartInfo.getSkuId(),JSON.toJSONString(cartInfo));
        }
        jedis.hmset(userCartKey,map);
        jedis.close();
        return cartInfoList;
    }

    @Override
    //合并购物车
    public List<CartInfo> mergeToCartList(List<CartInfo> cartListCK, String userId) {
        //先查询到数据库的数量
        List<CartInfo> cartInfoListDB = cartInfoMapper.selectCartListWithCurPrice(userId);
        boolean isMatch=false;
        for (CartInfo cartInfoCK : cartListCK) {
            for (CartInfo cartInfoDB : cartInfoListDB) {
                //如果cookie的skuId和数据库的skuId一样则合并数量
                if (cartInfoCK.getSkuId().equals(cartInfoDB.getSkuId())) {
                    cartInfoDB.setSkuNum(cartInfoCK.getSkuNum() + cartInfoDB.getSkuNum());
                    cartInfoMapper.updateByPrimaryKeySelective(cartInfoDB);
                    //匹配上skuId给true
                    isMatch = true;
                }
            }
            if (isMatch=false){
                //将未匹配上的存在cookie中的购物车数量也保存在数据库中
                cartInfoCK.setUserId(userId);
                cartInfoMapper.insertSelective(cartInfoCK);
            }
        }
        // 最终将合并之后的数据返回
        List<CartInfo> cartInfoList = loadCartCache(userId);

        //去结算时与未登陆是的购物车合并，除了合并数量外还要合并勾选，以cookie选中的时候为标准
        for (CartInfo cartInfoDB : cartInfoListDB) {
            for (CartInfo cartInfoCK : cartListCK) {
                if (cartInfoDB.getSkuId().equals(cartInfoCK.getSkuId())){
                    if ("1".equals(cartInfoCK.getIsChecked())){
                        //当未登录的时候选中的话，登陆后，redis中的商品状态要修改为选中
                        cartInfoDB.setIsChecked(cartInfoCK.getIsChecked());
                        checkCart(cartInfoDB.getSkuId(),"1",userId);
                    }
                }
            }
        }

        return cartInfoList;
    }

    @Override
    public void checkCart(String skuId, String isChecked, String userId) {
        //查询redis中购物车的商品详情
        //从redis中取得
        Jedis jedis = redisUtil.getJedis();
        // 构建key user:userid:cart
        String userCartKey = CartConst.USER_KEY_PREFIX+userId+CartConst.USER_CART_KEY_SUFFIX;
        String cartInfoJson = jedis.hget(userCartKey, skuId);
        //转换为对象
        CartInfo cartInfo = JSON.parseObject(cartInfoJson, CartInfo.class);
        //将前端传过来的isChecked cartInfo
        cartInfo.setIsChecked(isChecked);
        //回写进redis
        jedis.hset(userCartKey,skuId,JSON.toJSONString(cartInfo));

        //如果isChecked=1 修改redis的isChecked状态 并在redis中创建新的购物车列表存储被选中的商品
        // 新建一个购物车key user:userId:checked
        String cartKeyChecked = CartConst.USER_KEY_PREFIX+userId+CartConst.USER_CHECKED_KEY_SUFFIX;
        if ("1".equals(isChecked)){
            jedis.hset(cartKeyChecked,skuId,JSON.toJSONString(cartInfo));
        }else {
            //删除勾选的购物车
            jedis.hdel(cartKeyChecked,skuId);
        }
        jedis.close();
    }

    @Override
    public List<CartInfo> getCartCheckedList(String userId) {
        List<CartInfo> cartInfoList = new ArrayList<>();
        //从redis中取得
        Jedis jedis = redisUtil.getJedis();
        // 定义一个购物车key user:userId:checked
        String cartKeyChecked = CartConst.USER_KEY_PREFIX+userId+CartConst.USER_CHECKED_KEY_SUFFIX;
        //获取购物车全部的数据
        List<String> stringList = jedis.hvals(cartKeyChecked);
        if (stringList!=null){
            for (String cartJson : stringList) {
                cartInfoList.add(JSON.parseObject(cartJson,CartInfo.class));
            }
        }
        return cartInfoList;
    }
}
